package chapter11

import org.apache.spark.sql.Row
import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction}
import org.apache.spark.sql.types.{DataType, StructType}

/**
 * author: yuhui
 * descriptions:
 *
 * 用户自定义UDAF入门示例：求薪资的平均值
 * date: 2024 - 11 - 29 1:46 下午
 */
object UDAFExample extends UserDefinedAggregateFunction {

  // 函数输入的字段schema（字段名-字段类型）
  override def inputSchema: StructType = ???

  // 聚合过程中，用于存储局部聚合结果的schema
  // 比如求平均薪资，中间缓存(局部数据薪资总和,局部数据人数总和)
  override def bufferSchema: StructType = ???

  // 函数的最终返回结果数据类型
  override def dataType: DataType = ???

  // 你这个函数是否是稳定一致的？（对一组相同的输入，永远返回相同的结果），只要是确定的，就写true
  override def deterministic: Boolean = true

  // 对局部聚合缓存的初始化方法
  override def initialize(buffer: MutableAggregationBuffer): Unit = ???

  // 聚合逻辑所在方法，框架会不断地传入一个新的输入row，来更新你的聚合缓存数据
  override def update(buffer: MutableAggregationBuffer, input: Row): Unit = ???

  // 全局聚合：将多个局部缓存中的数据，聚合成一个缓存
  // 比如：薪资和薪资累加，人数和人数累加
  override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = ???

  // 最终输出
  // 比如：从全局缓存中取薪资总和/人数总和
  override def evaluate(buffer: Row): Any = ???
}